package com.smart.community.region.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.smart.community.region.dto.RegionTreeVO;
import com.smart.community.region.entity.Region;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

/**
 * 区域数据访问接口
 *
 * @author Wu.Liang
 * @since 2024-12-21
 */
@Mapper
public interface RegionMapper extends BaseMapper<Region> {

    /**
     * 根据区域编码查询区域
     * @param regionCode 区域编码
     * @return 区域实体
     */
    Region selectByRegionCode(@Param("regionCode") String regionCode);

    /**
     * 根据区域类型查询区域列表
     * @param regionType 区域类型
     * @return 区域列表
     */
    List<Region> selectByRegionType(@Param("regionType") Integer regionType);

    /**
     * 查询所有子区域
     * @param parentId 父级区域ID
     * @return 子区域列表
     */
    List<Region> selectChildren(@Param("parentId") Long parentId);

    /**
     * 查询区域树
     * @return 区域树列表
     */
    List<Region> selectRegionTree();

    /**
     * 查询所有子区域ID（递归）
     * @param regionId 区域ID
     * @return 子区域ID列表
     */
    List<Long> selectAllChildRegionIds(@Param("regionId") Long regionId);

    /**
     * 查询所有父区域ID（递归）
     * @param regionId 区域ID
     * @return 父区域ID列表
     */
    List<Long> selectAllParentRegionIds(@Param("regionId") Long regionId);

    /**
     * 查询区域层级路径
     * @param regionId 区域ID
     * @return 层级路径列表
     */
    List<Region> selectRegionPath(@Param("regionId") Long regionId);

    /**
     * 查询区域树形结构
     * @param parentId 父区域ID
     * @return 区域树形列表
     */
    List<RegionTreeVO> selectRegionTree(@Param("parentId") Long parentId);

    /**
     * 查询所有区域数据用于构建树形结构
     * @return 所有区域数据
     */
    List<RegionTreeVO> selectAllRegionsForTree();

    /**
     * 查询区域统计信息
     * @param regionId 区域ID
     * @return 区域统计信息
     */
    RegionTreeVO selectRegionStats(@Param("regionId") Long regionId);

    /**
     * 查询区域数量
     * @param parentId 父区域ID
     * @param regionType 区域类型
     * @return 区域数量
     */
    Long countRegions(@Param("parentId") Long parentId, @Param("regionType") Integer regionType);

    /**
     * 查询所有启用的区域
     * @return 启用的区域列表
     */
    List<Region> selectEnabledRegions();

    /**
     * 查询有权限的区域列表
     * @param userId 用户ID
     * @param type 权限类型
     * @return 有权限的区域列表
     */
    List<Region> selectByUserPermission(@Param("userId") Long userId, @Param("type") Integer type);

    /**
     * 查询区域列表
     * @param regionName 区域名称（模糊查询）
     * @return 区域列表
     */
    List<Region> selectByRegionName(@Param("regionName") String regionName);

    /**
     * 检查区域编码是否存在
     * @param regionCode 区域编码
     * @param excludeId 排除的区域ID
     * @return 存在数量
     */
    Boolean existsByRegionCode(@Param("regionCode") String regionCode, @Param("excludeId") Long excludeId);

    /**
     * 批量更新区域状态
     * @param regionIds 区域ID列表
     * @param status 状态
     * @return 更新数量
     */
    Integer batchUpdateStatus(@Param("regionIds") List<Long> regionIds, @Param("status") Integer status);

    /**
     * 批量删除区域
     * @param regionIds 区域ID列表
     * @return 删除数量
     */
    Integer batchDeleteByIds(@Param("regionIds") List<Long> regionIds);

    /**
     * 根据父区域ID查询子区域列表
     * @param parentId 父区域ID
     * @return 子区域列表
     */
    List<Region> selectByParentId(@Param("parentId") Long parentId);

    /**
     * 根据用户权限查询区域列表
     * @param userId 用户ID
     * @return 有权限的区域列表
     */
    List<Region> selectRegionsByUserPermission(@Param("userId") Long userId);

    /**
     * 查询区域列表
     * @param page 分页参数
     * @return 分页结果
     */
    IPage<Region> selectRegionPage(Page<Region> page);

    /**
     * 检查区域编码是否存在
     * @param regionCode 区域编码
     * @param excludeId 排除的区域ID
     * @return 存在数量
     */
    Integer checkRegionCodeExists(@Param("regionCode") String regionCode, @Param("excludeId") Long excludeId);

    /**
     * 更新区域状态
     * @param regionIds 区域ID列表
     * @param status 状态
     * @return 更新数量
     */
    Integer updateStatusByIds(@Param("regionIds") List<Long> regionIds, @Param("status") Integer status);
}
